Ch2. 값
2.1 배열
- 여러 타입을 담을 수 있음
delete연산자 가능
구멍난 배열
var a = [];
a[0] = 1;
a[2] = [3];
a[1]; // undefined
a.length; // 3
문자열 index
var a = [];
a[0] = 1;
a["footbar"] = 2;
a.length; // 1
a["footbar"]; // 2
a.footbar; // 2
string 타입 숫자 index
var a = [];
a["13"] = 42;
a.length; // 14
→ 해로운 버그, 그냥 쓰지 말자…
유사 배열
function aaa(a, b, c) {
console.log(arguments);
console.log(typeof arguments); // object
}
arguments는 유사 배열Array.from()으로 변환 가능
2.2 문자열
- 배열처럼 보이지만 immutable
a[1] = "O"은 변경되지 않음
Array 메서드 차용
var a = "foo";
var c = Array.prototype.join.call(a, '-'); // "f-o-o"
var d = Array.prototype.map.call(a, v => v.toUpperCase() + '.'); // ["F.", "O.", "O."]
→ 유니코드 문자열은 주의 (2바이트)
2.3 숫자
- JS는 정수/실수 구분 없이
number타입 하나
부동 소수점 이슈
0.1 + 0.2 === 0.3 // false
function closeEnough(a, b) {
return Math.abs(a - b) < Number.EPSILON;
}
안전한 정수
Number.isSafeInteger()사용- 64bit 정수는 문자열로 다루는 게 일반적
2.4 특수 값
undefined
undefined = 3;
console.log(undefined); // 3 (non-strict mode)
void 연산자
<a href="javascript:void(0)">???</a>
NaN
typeof NaN // "number"
NaN === NaN // false
2.5 값 vs 레퍼런스
값 복사
null,undefined,string,number,boolean,symbol
참조 복사
object,array,function, 기타 합성 타입
함수 내 참조
function foo(x) {
x.push(4);
}
var a = [1, 2, 3];
foo(a);
console.log(a); // [1, 2, 3, 4]
박싱과 값 복사
function foo(x) {
x = x + 1;
}
var a = new Number(2);
foo(a);
console.log(a); // 2
2.6 정리
- 값에는 다양한 타입이 있다
- 원시값과 참조값의 복사 방식이 다르다
- 숫자 관련 연산은 항상 정확하지 않을 수 있다 (부동소수점, EPSILON 활용)